package com.example.algorithm.array;

/**
 * @author : zhy
 * 给定一个数字，查找在数组中最短连续数组之和大于或者等于给定的数字长度最小值，如果有，则返回最小值
 * 没有则返回0
 * @since : 2022/7/22
 */
public class ArrayMinLength {


    /**
     * 暴力解法
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int minLen=Integer.MAX_VALUE;
        for(int i=0;i<len;i++)
        {
            int sum=0;
            for(int j=i;j<len;j++)
            {
                sum+=nums[j];
                if(sum>=target){
                    int tempLen=j-i+1;
                    minLen=minLen<tempLen?minLen:tempLen;
                    break;
                }
            }
        }
        return minLen==Integer.MAX_VALUE?0:minLen;
    }


    /**
     * 滑动窗口（其实也就是暴力解法中的一个）
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen1(int target, int[] nums){
        int left=0;
        int right=nums.length;
        int sum=0;
        int result=Integer.MAX_VALUE;
        for(int i=0;i<right;i++)
        {
            sum+=nums[i];
            while(sum>=target){
                result=Math.min(result,i-left+1);
                sum-=nums[left++];
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }

    public int minSubArrayLen2(int s, int[] nums) {
        int left = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= s) {
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

    public static void main(String[] args) {
        ArrayMinLength arrayMinLength = new ArrayMinLength();
        int []num={2,3,1,2,4,3};
        System.out.println(arrayMinLength.minSubArrayLen1(7, num));
    }
}
